package org.truenewx.tnxjee.service.security.access;

import java.util.Collection;
import jakarta.validation.constraints.NotNull;

import org.springframework.security.core.GrantedAuthority;
import org.truenewx.tnxjee.model.spec.user.security.UserConfigAuthority;

/**
 * 获权判定器
 */
public interface GrantedAuthorityDecider {

    /**
     * 判断指定获权集合在指定配置权限内是否匹配
     *
     * @param authorities 获权集合
     * @param type        用户类型
     * @param rank        用户级别
     * @param permission  许可
     * @return 指定获权集合在指定配置权限内是否匹配
     */
    boolean isGranted(Collection<? extends GrantedAuthority> authorities, String type, String rank, String permission);

    /**
     * 判断指定获权集合在指定配置权限内是否匹配
     *
     * @param authorities     获权集合
     * @param intranet        是否局域网内访问
     * @param configAuthority 配置权限
     * @return 指定获权集合在指定配置权限内是否匹配
     */
    default boolean isGranted(Collection<? extends GrantedAuthority> authorities, boolean intranet,
            @NotNull UserConfigAuthority configAuthority) {
        if (configAuthority.isDenyAll()) { // 拒绝所有访问
            return false;
        }
        if (configAuthority.isIntranet() && !intranet) { // 局域网访问判断
            return false;
        }
        // 获权集合判断
        return isGranted(authorities, configAuthority.getType(), configAuthority.getRank(), configAuthority.getPermission());
    }

}
